package uloha2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Iterator;
import java.util.PriorityQueue;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Batoh {

    HashMap<Integer, VecDoBatohu> zoznamVeci;
    int pocetVeciVbatohu;
    int citac;
    int maxHmotnost;
    double dosavadnaMaxCena;
    String citacBinarny;
    int[] poleKonfiguracie;
    int[] konfiguraciaSmaxHodnotou;
    int cisloInstancie;
    public PriorityQueue<VecDoBatohu> fronta;
    BufferedWriter stream;

    public Batoh(int maxHmotnost, int pocetVeciVbatohu, int cisloInstancie) {
        this.maxHmotnost = maxHmotnost;
        this.pocetVeciVbatohu = pocetVeciVbatohu;
        this.cisloInstancie = cisloInstancie;

        zoznamVeci = new HashMap<Integer, VecDoBatohu>();
        konfiguraciaSmaxHodnotou = new int[pocetVeciVbatohu];
        dosavadnaMaxCena = 0;
        fronta = new PriorityQueue<VecDoBatohu>();
    }

    public void pridajVecDoBatohu(Integer index, VecDoBatohu vec) {
        zoznamVeci.put(index, vec);
    }

    void setStream(BufferedWriter out) {
        stream = out;
    }

    void vyriesProblemAvypisRiesenie(BufferedWriter out) { 
         try {

            dosavadnaMaxCena = 0;
            konfiguraciaSmaxHodnotou = new int[pocetVeciVbatohu];
            Arrays.fill(konfiguraciaSmaxHodnotou, 0);

            int aktualnaHmotnostBatohu = 0;
            int aktualnaCena = 0;
            VecDoBatohu temp = null ;
            while((temp = fronta.poll())!=null)
            {
               //System.out.print(" "+temp.pomerCenaHmotnost);
                if ((aktualnaHmotnostBatohu + temp.getHmotnostVeci()) <= maxHmotnost) {
                        aktualnaHmotnostBatohu += temp.getHmotnostVeci();
                        konfiguraciaSmaxHodnotou[temp.getId() - 1] = 1;
                        aktualnaCena += temp.getCenaVeci();
                    }
            }
//            Iterator it = fronta.iterator();
//            while (it.hasNext()) {
//                Object o = it.next();
//                if (o instanceof VecDoBatohu) {
//                    VecDoBatohu temp = (VecDoBatohu) o;
//                    System.out.print(" "+temp.pomerCenaHmotnost);
//                    if ((aktualnaHmotnostBatohu + temp.getHmotnostVeci()) <= maxHmotnost) {
//                        aktualnaHmotnostBatohu += temp.getHmotnostVeci();
//                        konfiguraciaSmaxHodnotou[temp.getId() - 1] = 1;
//                        aktualnaCena += temp.getCenaVeci();
//                    }
//                }
//            }
            dosavadnaMaxCena = aktualnaCena;
            System.out.print(cisloInstancie + " " + zoznamVeci.size() + " " + (int) dosavadnaMaxCena + " ");
            for (int i = 0; i < konfiguraciaSmaxHodnotou.length; i++) {
                System.out.print(konfiguraciaSmaxHodnotou[i] + " ");
            }
            stream.write(String.valueOf((int) dosavadnaMaxCena));
            stream.newLine();
            System.out.print("\n");
        } catch (IOException ex) {
            Logger.getLogger(Batoh.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public boolean skontrolujPodmienku(int[] konfiguracia) {
        double sumaHmotnosti = 0;
        for (int i = 0; i < konfiguracia.length; i++) {
            sumaHmotnosti += konfiguracia[i] * (((VecDoBatohu) zoznamVeci.get(i + 1)).hmotnostVeci);
       
        }
        if (sumaHmotnosti <= maxHmotnost) {
            return true;
        } return false;
    }
    }

